const express = require('express');
const router = express.Router();
const multer = require('multer');
const path = require('path');
const fs = require('fs');
const db = require('../db');

// 中间件：检查用户是否已登录
const requireAuth = (req, res, next) => {
  if (!req.session.userId) {
    return res.status(401).json({ error: '未授权，请先登录' });
  }
  next();
};

// 配置文件上传
const storage = multer.diskStorage({
  destination: function (req, file, cb) {
    const uploadDir = path.join(__dirname, '../../uploads');
    if (!fs.existsSync(uploadDir)) {
      fs.mkdirSync(uploadDir, { recursive: true });
    }
    cb(null, uploadDir);
  },
  filename: function (req, file, cb) {
    // 处理文件名，保留原始扩展名
    const originalName = Buffer.from(file.originalname, 'latin1').toString('utf8');
    const ext = path.extname(originalName);
    const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9);
    cb(null, uniqueSuffix + ext);
  }
});

const fileFilter = (req, file, cb) => {
  // 这里可以添加文件类型限制
  cb(null, true);
};

const upload = multer({
  storage: storage,
  fileFilter: fileFilter,
  limits: {
    fileSize: 10 * 1024 * 1024 // 限制文件大小为10MB
  }
});

// 上传文件
router.post('/upload', requireAuth, upload.single('file'), async (req, res) => {
  try {
    if (!req.file) {
      return res.status(400).json({ error: '没有上传文件' });
    }
    
    // 正确处理文件名
    const originalName = Buffer.from(req.file.originalname, 'latin1').toString('utf8');
    
    const file = await db.saveFile({
      filename: req.file.filename,
      originalName: originalName,
      path: req.file.path,
      mimeType: req.file.mimetype,
      size: req.file.size,
      userId: req.session.userId
    });
    
    res.status(201).json({
      id: file.id,
      filename: file.filename,
      originalName: originalName,
      url: `/api/files/${file.id}`
    });
  } catch (error) {
    console.error('文件上传错误:', error);
    res.status(500).json({ error: '文件上传失败' });
  }
});

// 下载文件
router.get('/:id', async (req, res) => {
  try {
    const fileId = req.params.id;
    const file = await db.getFileById(fileId);
    
    if (!file) {
      return res.status(404).json({ error: '文件未找到' });
    }
    
    const filePath = path.join(__dirname, '../../uploads', file.filename);
    
    // 检查文件是否存在
    if (!fs.existsSync(filePath)) {
      return res.status(404).json({ error: '文件不存在' });
    }
    
    // 设置响应头，确保文件名正确编码
    res.setHeader('Content-Disposition', `attachment; filename*=UTF-8''${encodeURIComponent(file.original_name)}`);
    res.setHeader('Content-Type', file.mime_type || 'application/octet-stream');
    
    // 发送文件
    res.sendFile(filePath);
  } catch (error) {
    console.error('文件下载错误:', error);
    res.status(500).json({ error: '文件下载失败' });
  }
});

// 删除文件
router.delete('/:id', requireAuth, async (req, res) => {
  try {
    const fileId = req.params.id;
    
    // 获取文件信息
    const file = await db.getFileById(fileId);
    
    if (!file) {
      return res.status(404).json({ error: '文件未找到' });
    }
    
    // 检查是否是文件的所有者
    if (file.user_id !== req.session.userId) {
      return res.status(403).json({ error: '没有权限删除此文件' });
    }
    
    // 删除物理文件
    const filePath = path.join(__dirname, '../../uploads', file.filename);
    if (fs.existsSync(filePath)) {
      fs.unlinkSync(filePath);
    }
    
    // 从数据库删除文件记录
    await db.deleteFile(fileId);
    
    res.json({ message: '文件已成功删除' });
  } catch (error) {
    console.error('文件删除错误:', error);
    res.status(500).json({ error: '文件删除失败' });
  }
});

// 获取用户上传的文件列表
router.get('/user/files', requireAuth, async (req, res) => {
  try {
    const files = await db.getFilesByUser(req.session.userId);
    
    // 转换文件列表，添加下载URL
    const formattedFiles = files.map(file => ({
      id: file.id,
      filename: file.original_name,
      size: file.size,
      createdAt: file.created_at,
      url: `/api/files/${file.id}`
    }));
    
    res.json(formattedFiles);
  } catch (error) {
    console.error('获取文件列表错误:', error);
    res.status(500).json({ error: '获取文件列表失败' });
  }
});

module.exports = router; 